package SourceCode.FunctionInterface.code;

import java.util.Objects;
import java.util.function.Function;

/**
 * @Description 接受一个参数，根据参数出生成一个参数
 * @Author bloodcolding
 * @Date 2021/01/23 4:43 PM
 */
public class ImpFunction<T, R> implements Function<T, R> {

    /**
     * 完成对应两种类型的转换
     *
     * @param t
     * @return
     */
    @Override
    public R apply(T t) {
        return (R) t;
    }

    /**
     * 调用before的apply()，然后调用当前接口的apply()
     *
     * @param before
     * @param <V>    返回值的格式
     * @return
     */
    @Override
    public <V> Function<V, R> compose(Function<? super V, ? extends T> before) {
        Objects.requireNonNull(before);
        return (V v) -> apply(before.apply(v));
    }

    /**
     * 在当前接口调用apply()后调用after的apply()，
     *
     * @param after
     * @param <V>
     * @return
     */
    @Override
    public <V> Function<T, V> andThen(Function<? super R, ? extends V> after) {
        Objects.requireNonNull(after);
        return (T t) -> after.apply(apply(t));
    }

    /**
     * 总是返回自己的方法
     *
     * @param <T>
     * @return
     */
    static <T> Function<T, T> identity() {
        return t -> t;
    }

    public static void main(String[] args) {

    }
}
